package com.astronomia.wheels.service_data;

import com.astronomia.wheels.pojo.Student;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;

public class Data_Intersection_Old_New {

    /**
     * 两个集合，有交集的部分，使用旧集合中的元素，没有交集的部分使用新的集合
     * 给ClamJ同学写的数据处理方法
     * @param args
     */
    public static void main(String[] args) {

        Map<String, List<Student>> data = generator();// 生成假数据
        List<Student> olds = data.get("1");  // a b c
        List<Student> news = data.get("2");  // b c d

        // 先搞到交集，拿到两个list中重复的那一部分，就是bc,这里要保证拿到的bc一定是老数据。再和新list的做合并，有重复的按照旧数据里边的
        List<Student> collect = new ArrayList<>(Stream.of(
                olds.stream().filter(item -> news.stream().map(e -> e.getName())
                        .collect(toList()).contains(item.getName()))
                        .collect(Collectors.toMap(Student::getName, a -> a, (k1, k2) -> k1)),
                news.stream().collect(Collectors.toMap(Student::getName, a -> a, (k1, k2) -> k1)))
                .flatMap(map -> map.entrySet().stream())
                .collect(Collectors.toMap(
                        Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1)).values());

        System.out.println(collect);

    }


    private static Map<String, List<Student>> generator(){

        List<Student> olds = new ArrayList<>();    // a b c
        olds.add(new Student().setName("张三").setScore("55").setSex("女"));
        olds.add(new Student().setName("李四").setScore("12").setSex("男"));
        olds.add(new Student().setName("王五").setScore("55").setSex("男"));
        olds.add(new Student().setName("哈哈").setScore("32").setSex("男"));
        olds.add(new Student().setName("想想").setScore("31").setSex("男"));

        List<Student> news = new ArrayList<>();    // b c d
        news.add(new Student().setName("李四").setScore(null).setSex("男"));
        news.add(new Student().setName("王五").setScore(null).setSex("男"));
        news.add(new Student().setName("赵六").setScore("74").setSex("女"));
        news.add(new Student().setName("新的").setScore("51").setSex("女"));

        Map<String, List<Student>> map = new HashMap<>();
        map.put("1", olds); map.put("2", news);
        return map;
    }

}

